package client.presenter;

import com.thoughtworks.xstream.annotations.XStreamAlias;

import common.Settings;

public class ClientSettings implements Settings {
	// Connection settings
	
	@XStreamAlias("ServerIP")
	private String serverIP;
	
	@XStreamAlias("ConnectionPort")
	private int connectionPort;
	
	@XStreamAlias("SocketTimeout")
	private int socketTimeout;
	
	// 2048 settings
	
	@XStreamAlias("twoThousandFortyEightBoardSize")
	private int twoThousandFortyEightBoardSize;
	
	@XStreamAlias("twoThousandFortyEightWinningTile")
	private int twoThousandFortyEightWinningTile;
	
	// Maze settings
	
	@XStreamAlias("StraightMoveScore")
	private int straightMoveScore;
	
	@XStreamAlias("DiagonalMoveScore")
	private int diagonalMoveScore;
	
	@XStreamAlias("StarterMaze")
	private int[][] starterMaze;
	
	@XStreamAlias("EasyMazeWidth")
	private int easyMazeWidth;
	
	@XStreamAlias("EasyMazeHeight")
	private int easyMazeHeight;
	
	@XStreamAlias("MediumMazeWidth")
	private int mediumMazeWidth;
	
	@XStreamAlias("MediumMazeHeight")
	private int mediumMazeHeight;
	
	@XStreamAlias("HardMazeWidth")
	private int hardMazeWidth;
	
	@XStreamAlias("HardMazeHeight")
	private int hardMazeHeight;
	
	// UI settings
	
	@XStreamAlias("GameSettingsExtension")
	private String gameSettingsExtension;
	
	@XStreamAlias("HintImagePath-Up")
	private String up;
	
	@XStreamAlias("HintImagePath-Down")
	private String down;
	
	@XStreamAlias("HintImagePath-Left")
	private String left;
	
	@XStreamAlias("HintImagePath-Right")
	private String right;
	
	@XStreamAlias("HintImagePath-Up-Right")
	private String upRight;
	
	@XStreamAlias("HintImagePath-Up-Left")
	private String upLeft;
	
	@XStreamAlias("HintImagePath-Down-Right")
	private String downRight;
	
	@XStreamAlias("HintImagePath-Down-Left")
	private String downLeft;
	
	@XStreamAlias("HintImageTimeoutMS")
	private int hintTimeout;
	
	@XStreamAlias("AutoSolveSpeedMS-Slow")
	private int slowSpeed;
	
	@XStreamAlias("AutoSolveSpeedMS-Normal")
	private int normalSpeed;
	
	@XStreamAlias("AutoSolveSpeedMS-Fast")
	private int fastSpeed;
	
	public ClientSettings() {
	}
	
	public ClientSettings(String serverIP, int connectionPort, int socketTimeout, int twoThousandFortyEightBoardSize,
						  int twoThousandFortyEightWinningTile, int straightMoveScore, int diagonalMoveScore, int[][] starterMaze,
						  int easyMazeWidth, int easyMazeHeight, int mediumMazeWidth, int mediumMazeHeight, int hardMazeWidth, int hardMazeHeight,
						  String gameSettingsExtension, String up, String down, String left, String right,
						  String upRight, String upLeft, String downRight, String downLeft, int hintTimeout,
						  int slowSpeed, int normalSpeed, int fastSpeed) {
		// Connection settings
		this.serverIP = serverIP;
		this.connectionPort = connectionPort;
		this.socketTimeout = socketTimeout;
		
		// 2048 settings
		this.twoThousandFortyEightBoardSize = twoThousandFortyEightBoardSize;
		this.twoThousandFortyEightWinningTile = twoThousandFortyEightWinningTile;
		
		// Maze settings
		this.straightMoveScore = straightMoveScore;
		this.diagonalMoveScore = diagonalMoveScore;
		this.starterMaze = starterMaze;
		this.easyMazeWidth = easyMazeWidth;
		this.easyMazeHeight = easyMazeHeight;
		this.mediumMazeWidth = mediumMazeWidth;
		this.mediumMazeHeight = mediumMazeHeight;
		this.hardMazeWidth = hardMazeWidth;
		this.hardMazeHeight = hardMazeHeight;
		
		// UI settings
		this.gameSettingsExtension = gameSettingsExtension;
		this.up = up;
		this.down = down;
		this.left = left;
		this.right = right;
		this.upRight = upRight;
		this.upLeft = upLeft;
		this.downRight = downRight;
		this.downLeft = downLeft;
		this.hintTimeout = hintTimeout;
		this.slowSpeed = slowSpeed;
		this.normalSpeed = normalSpeed;
		this.fastSpeed = fastSpeed;
	}
	
	@Override
	public String getClassAlias() {
		return "ClientSettings";
	}

	/**
	 * @return the serverIP
	 */
	public String getServerIP() {
		return serverIP;
	}

	/**
	 * @return the connectionPort
	 */
	public int getConnectionPort() {
		return connectionPort;
	}

	/**
	 * @return the socketTimeout
	 */
	public int getSocketTimeout() {
		return socketTimeout;
	}

	/**
	 * @return the twoThousandFortyEightBoardSize
	 */
	public int get2048BoardSize() {
		return twoThousandFortyEightBoardSize;
	}

	/**
	 * @return the twoThousandFortyEightWinningTile
	 */
	public int get2048WinningTile() {
		return twoThousandFortyEightWinningTile;
	}

	/**
	 * @return the straightMoveScore
	 */
	public int getStraightMoveScore() {
		return straightMoveScore;
	}

	/**
	 * @return the diagonalMoveScore
	 */
	public int getDiagonalMoveScore() {
		return diagonalMoveScore;
	}

	/**
	 * @return the starterMaze
	 */
	public int[][] getStarterMaze() {
		return starterMaze;
	}

	/**
	 * @return the easyMazeWidth
	 */
	public int getEasyMazeWidth() {
		return easyMazeWidth;
	}

	/**
	 * @return the easyMazeHeight
	 */
	public int getEasyMazeHeight() {
		return easyMazeHeight;
	}

	/**
	 * @return the mediumMazeWidth
	 */
	public int getMediumMazeWidth() {
		return mediumMazeWidth;
	}

	/**
	 * @return the mediumMazeHeight
	 */
	public int getMediumMazeHeight() {
		return mediumMazeHeight;
	}

	/**
	 * @return the hardMazeWidth
	 */
	public int getHardMazeWidth() {
		return hardMazeWidth;
	}

	/**
	 * @return the hardMazeHeight
	 */
	public int getHardMazeHeight() {
		return hardMazeHeight;
	}

	/**
	 * @return the gameSettingsExtension
	 */
	public String getGameSettingsExtension() {
		return gameSettingsExtension;
	}

	/**
	 * @return the up
	 */
	public String getHintImageUp() {
		return up;
	}

	/**
	 * @return the down
	 */
	public String getHintImageDown() {
		return down;
	}

	/**
	 * @return the left
	 */
	public String getHintImageLeft() {
		return left;
	}

	/**
	 * @return the right
	 */
	public String getHintImageRight() {
		return right;
	}

	/**
	 * @return the upRight
	 */
	public String getHintImageUpRight() {
		return upRight;
	}

	/**
	 * @return the upLeft
	 */
	public String getHintImageUpLeft() {
		return upLeft;
	}

	/**
	 * @return the downRight
	 */
	public String getHintImageDownRight() {
		return downRight;
	}

	/**
	 * @return the downLeft
	 */
	public String getHintImageDownLeft() {
		return downLeft;
	}

	/**
	 * @return the hintTimeout
	 */
	public int getHintTimeout() {
		return hintTimeout;
	}

	/**
	 * @return the slowSpeed
	 */
	public int getAutoSolveSlowSpeed() {
		return slowSpeed;
	}

	/**
	 * @return the normalSpeed
	 */
	public int getAutoSolveNormalSpeed() {
		return normalSpeed;
	}

	/**
	 * @return the fastSpeed
	 */
	public int getAutoSolveFastSpeed() {
		return fastSpeed;
	}
}
